package com.cxps.server.role.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cxps.cloud.base.Option;
import com.cxps.cloud.enums.DataStatus;
import com.cxps.cloud.utils.IdUtils;
import com.cxps.server.role.domain.Role;
import com.cxps.server.role.domain.RoleMenu;
import com.cxps.server.role.mapper.RoleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 系统角色 服务实现类
 * </p>
 *
 * @author YouCai.Liu
 * @since 2021-10-18
 */
@Service
public class RoleService {

    @Autowired
    private RoleMapper roleMapper;

    /**
     * 角色列表
     *
     * @return
     */
    public List<Role> list() {
        QueryWrapper<Role> qw = new QueryWrapper<>();
        qw.eq("status", DataStatus.ON_LINE.getCode());
        qw.orderByDesc("update_time");
        return roleMapper.selectList(qw);
    }

    /**
     * 添加角色
     *
     * @param role
     */
    public void add(Role role) {
        role.setId(IdUtils.generateId());
        role.preInsert();
        roleMapper.insert(role);
    }

    /**
     * 根据ID查询角色
     *
     * @param id
     * @return
     */
    public Role getRoleById(String id) {
        return roleMapper.selectById(id);
    }

    /**
     * 修改角色
     *
     * @param role
     */
    public void update(Role role) {
        role.preUpdate();
        roleMapper.updateById(role);
    }

    /**
     * 批量删除
     *
     * @param ids
     */
    public void batchDel(String[] ids) {
        for (String id : ids) {
            Role role = new Role();
            role.preUpdate();
            role.setStatus(DataStatus.OFF_LINE.getCode());
            role.setId(id);
            roleMapper.updateById(role);
        }
    }

    /**
     * 添加权限
     *
     * @param id
     * @param menus
     */
    @Transactional
    public void addMenu(String id, String[] menus) {
        // 删除原有权限
        roleMapper.delMenuByRoleId(id);

        // 保存新的权限
        List<RoleMenu> list = new ArrayList<>();
        for (String menuId : menus) {
            RoleMenu rm = new RoleMenu();
            rm.setId(IdUtils.generateId());
            rm.setRoleId(id);
            rm.setMenuId(menuId);
            list.add(rm);
        }
        roleMapper.addMenu(list);
    }

    /**
     * 角色集合信息
     *
     * @return
     */
    public List<Option> getRoles() {
        List<Option> list = new ArrayList<>();

        QueryWrapper<Role> qw = new QueryWrapper<>();
        qw.select("id", "role_name");
        qw.eq("status", DataStatus.ON_LINE.getCode());
        qw.orderByDesc("role_name");
        List<Role> roles = roleMapper.selectList(qw);
        for (Role role : roles) {
            list.add(new Option(role.getId(), role.getRoleName()));
        }

        return list;
    }

    /**
     * 根据ID查询角色权限集合
     *
     * @param id
     * @return
     */
    public List<String> getRoleMenuByRoleId(String id) {
        return roleMapper.getRoleMenuByRoleId(id);
    }
}
